import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import mplfinance as mpf
from datetime import datetime
import os

# 设置中文显示
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

print("开始分析比亚迪历史行情数据...")

# 读取文件
file_path = "比亚迪后复权历史行情数据.xlsx"
print(f"读取文件: {file_path}")
df = pd.read_excel(file_path)

# 打印数据基本信息
print(f"数据形状: {df.shape}")
print("\n数据前5行:")
print(df.head())

# 打印列名
print("\n数据列名:")
print(df.columns.tolist())

# 对定量变量进行描述性分析
print("\n定量变量描述性分析:")
numeric_cols = df.select_dtypes(include=['float64', 'int64']).columns
print(f"定量变量: {numeric_cols.tolist()}")
descriptive_stats = df[numeric_cols].describe()
print(descriptive_stats)

# 确保日期列格式正确
if '日期' in df.columns:
    df['日期'] = pd.to_datetime(df['日期'])
    print(f"\n日期范围: {df['日期'].min()} 到 {df['日期'].max()}")
else:
    print("警告: 未找到日期列")

# (2) 计算变量之间的相关系数，并绘制相关系数热力图
print("\n(2) 计算变量相关系数并绘制热力图...")
try:
    # 计算相关系数
    corr_matrix = df[numeric_cols].corr()
    print("\n变量相关系数矩阵:")
    print(corr_matrix.round(2))
    
    # 绘制相关系数热力图
    plt.figure(figsize=(12, 8))
    sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt='.2f', square=True)
    plt.title('变量相关系数热力图')
    plt.tight_layout()
    plt.savefig('correlation_heatmap.png', dpi=300)
    plt.close()
    print("✅ 相关系数热力图已保存为 correlation_heatmap.png")
except Exception as e:
    print(f"❌ 生成相关系数热力图时出错: {str(e)}")

# (3) 绘制2023年全年的收盘价时序图
print("\n(3) 绘制2023年全年收盘价时序图...")
try:
    if '日期' in df.columns and '收盘' in df.columns:
        # 筛选2023年的数据
        df_2023 = df[df['日期'].dt.year == 2023].copy()
        print(f"2023年数据量: {len(df_2023)} 条记录")
        
        plt.figure(figsize=(14, 7))
        plt.plot(df_2023['日期'], df_2023['收盘'], marker='o', linestyle='-', color='blue', markersize=3)
        plt.title('2023年比亚迪股价收盘价时序图')
        plt.xlabel('日期')
        plt.ylabel('收盘价')
        plt.grid(True, linestyle='--', alpha=0.7)
        plt.tight_layout()
        plt.savefig('2023_close_price.png', dpi=300)
        plt.close()
        print("✅ 2023年收盘价时序图已保存为 2023_close_price.png")
    else:
        print("❌ 缺少'日期'或'收盘'列")
except Exception as e:
    print(f"❌ 生成2023年收盘价时序图时出错: {str(e)}")

# (4) 绘制2023年4月到2023年6月的K线图
def analyze_k_line(df_k_line):
    print("\n2023年4月-6月K线图分析:")
    
    try:
        # 计算基本统计量
        price_change = df_k_line['Close'].iloc[-1] - df_k_line['Close'].iloc[0]
        percent_change = (price_change / df_k_line['Close'].iloc[0]) * 100
        
        print(f"起始收盘价: {df_k_line['Close'].iloc[0]:.2f}")
        print(f"结束收盘价: {df_k_line['Close'].iloc[-1]:.2f}")
        print(f"期间涨跌额: {price_change:.2f}")
        print(f"期间涨跌幅: {percent_change:.2f}%")
        
        # 找出最高价和最低价
        print(f"最高价: {df_k_line['High'].max():.2f} (出现日期: {df_k_line['High'].idxmax().strftime('%Y-%m-%d')})")
        print(f"最低价: {df_k_line['Low'].min():.2f} (出现日期: {df_k_line['Low'].idxmin().strftime('%Y-%m-%d')})")
        
        # 简单趋势分析
        if percent_change > 5:
            print("整体趋势: 上涨")
        elif percent_change < -5:
            print("整体趋势: 下跌")
        else:
            print("整体趋势: 震荡")
    except Exception as e:
        print(f"❌ K线图分析时出错: {str(e)}")

print("\n(4) 绘制2023年4月到6月的K线图...")
try:
    if '日期' in df.columns and all(col in df.columns for col in ['开盘', '最高', '最低', '收盘', '成交量']):
        # 筛选2023年4月到6月的数据
        start_date = '2023-04-01'
        end_date = '2023-06-30'
        df_k_line = df[(df['日期'] >= start_date) & (df['日期'] <= end_date)].copy()
        print(f"2023年4月-6月数据量: {len(df_k_line)} 条记录")
        
        if len(df_k_line) > 0:
            # 确保列名符合mplfinance的要求
            df_k_line = df_k_line.rename(columns={
                '日期': 'Date',
                '开盘': 'Open',
                '最高': 'High',
                '最低': 'Low',
                '收盘': 'Close',
                '成交量': 'Volume'
            })
            
            # 设置日期为索引
            df_k_line = df_k_line.set_index('Date')
            
            # 绘制K线图
            mpf.plot(df_k_line, type='candle', style='charles', title='2023年4月-6月比亚迪K线图',
                    ylabel='价格', volume=True, ylabel_lower='成交量', savefig='k_line_chart.png')
            print("✅ K线图已保存为 k_line_chart.png")
            
            # 对K线图进行简单分析
            analyze_k_line(df_k_line)
        else:
            print("❌ 未找到2023年4月-6月的数据")
    else:
        print(f"❌ 缺少K线图所需的列。检查的列: {'日期'}, {'开盘'}, {'最高'}, {'最低'}, {'收盘'}, {'成交量'}")
        print(f"数据中存在的列: {df.columns.tolist()}")
except Exception as e:
    print(f"❌ 生成K线图时出错: {str(e)}")

# 检查生成的文件
print("\n生成的文件列表:")
for file in os.listdir('.'):
    if file.endswith('.png'):
        print(f"- {file}")

print("\n分析完成！")